package register

import (
	"autoDeploy/config"
	"autoDeploy/dao/myselfMysql"
	"autoDeploy/models"
	"autoDeploy/utils/sendSms"
	"autoDeploy/utils/token"
	"errors"
	"fmt"
	"strconv"
	"time"
)

//	RegisterUser
//
// 描述信息：拿到前端的user对象，创建一个新用户,并设置token
//
// Param：
//
//	user ：用户注册信息实例
//
// Return：
//
//	string：用户token
//	error ：错误信息
func RegisterUser(user User) (string, error) {
	//fmt.Println("进入注册的service层")
	//创建mysql客户端实例
	db, err := myselfMysql.CreateMySQLClient(config.MysqlDb)
	if err != nil {
		return "", errors.New("注册service层，创建mysql客户端实例出错:" + err.Error())
	}

	// 检查手机号是否已经注册过
	var existingUser models.User
	result := db.Where("phone = ?", user.Phone).First(&existingUser)
	//fmt.Println(result, existingUser)
	if result.Error == nil {
		// 如果手机号已经存在，返回错误
		fmt.Println(existingUser.Username)
		return "", errors.New("该手机号已经注册了，可以直接进行登录")
	}

	// 创建一个 models.User 的实例并从 formUser 中复制数据
	dbUser := models.User{
		Username:  user.Username,
		Password:  user.Password,
		Phone:     user.Phone,
		Email:     "该用户暂时没有绑定邮箱", // 设置默认邮箱
		Avatar:    "该用户没有设置头像",   // 设置默认头像
		CreatedAt: time.Now(),    // 设置当前时间为创建时间
		UpdatedAt: time.Now(),    // 设置当前时间为更新时间
	}

	// 将 dbUser 实例插入到数据库中
	result = db.Create(&dbUser)
	if result.Error != nil {
		// 处理错误
		return "", errors.New("将 dbUser 实例插入到数据库中失败：" + result.Error.Error())
	}

	// 创建用户角色关联实例
	userRole := models.UserSysRoles{
		UserID:    dbUser.ID,
		RoleID:    2, // 默认角色ID为2
		CreatedAt: time.Now(),
		UpdatedAt: time.Now(),
	}
	result = db.Create(&userRole)
	if result.Error != nil {
		return "", errors.New("将用户分配到默认角色失败：" + result.Error.Error())
	}

	//设置token和用户默认普通角色
	tokenStr, err := OperateToken(user)
	if err != nil {
		return "", err
	}
	return tokenStr, nil
}

//	OperateToken
//
// 描述信息：将用户id和token存入redis
//
// Param：
//
//	user ：用户信息
//
// Return：
//
//	string ：token
//	error ：错误信息
func OperateToken(user User) (string, error) {
	//创建一个用户token
	tokenStr, err := token.GenerateToken(user.Phone, uint64(2))
	if err != nil {
		return " ", err
	}
	//根据用户 手机号 查询 id
	var userID uint
	db, err := myselfMysql.CreateMySQLClient(config.MysqlDb)
	result := db.Model(&models.User{}).
		Select("id").
		Where("phone = ?", user.Phone).
		First(&userID)
	if result.Error != nil {
		// 处理错误
		return " ", result.Error
	}

	//将用户id和token存入redis
	err = token.AddToken(strconv.Itoa(int(userID)), tokenStr, config.TokenExpireDuration)
	if err != nil {
		return "", err
	}

	return tokenStr, nil

}

// GetValidateCode 获取验证码
func GetValidateCode(phone string) (string, error) {
	code := sendSms.RandInt64(1000, 1999)
	codeStr := strconv.FormatInt(code, 10)
	//发送验证码
	res, success := sendSms.TxSendSms(phone, codeStr)
	if !success {
		return "", errors.New(res)
	}
	return codeStr, nil

}
